<?php
namespace controller;
require_once ('src/View/AdminView.php');
require_once ('src/View/DateView.php');
require_once ('src/View/HTMLView.php');
require_once ('src/View/HTMLFormView.php');
require_once ('src/View/HTMLBlogView.php');
require_once ('src/View/HTMLCommentView.php');
require_once ('src/View/HTMLAdminView.php');
require_once ('src/View/LoginStatusView.php');
require_once ('src/Controller/BlogController.php');
require_once ('src/Controller/CommentController.php');

class ApplicationController {


    /**
    * @param object \controller\LoginController $loginModel
    * @param object \controller\LoginController $loginView
    * @param object \controller\LoginController $newUserController
    * @return string HTML
    *
    * i denna funktionen så skapas själva applikationen, den visar att blogposter och kontrollerar vad användaren vill göra,
    * den får information från logincontrollern om användaren lyckats logga in eller ej
    */
	public function outputController (\model\LoginModel $loginModel, \view\LoginView $loginView,  \controller\NewUserController $newUserController) {

        //mina objekt
        $adminView = new \view\AdminView($loginModel);          //admin-vyn som kollar om Admin-användare loggat in, skickar med $loginModel
        $dateView = new \view\DateView();                       //date-vyn som skapar ett datum som visas på första sidan och för alla bloggar/komentarer
        $htmlView = new \view\HTMLView();                       //alla knappar, länkar mm i html
        $htmlFormView = new \view\HTMLFormView();               //alla forumär i html-format
        $htmlBlogView = new \view\HTMLBlogView();               //all html-kod som berör själva blog-koden
        $htmlCommentView = new \view\HTMLCommentView();         //all html-kod som berör själva kommenteringsdelen
        $loginStatusView = new \view\LoginStatusView();         //loginstatus-vyn som visar om man tex knappat rätt inloggningsuppgifter eller loggat ut
        $htmlAdminView = new \view\HTMLAdminView();             //all html-kod för Admin-menyn
        $blogController = new \controller\BlogController($loginModel);              //vår blogkontroller skapas här och skickar med $loginModel
        $commentController = new \controller\CommentController($loginModel);        //vår commentkontroller skapas här och skickar med $loginModel

        //kod till loginformuläret
        $loginStatus = $loginStatusView->returnLoginStatus($loginModel);            //loginstatusen om användaren tex knappat rätt inloggningsuppgifter
        $userLogin = $loginView->getInput();                                        //här hämtar vi ut om användaren fyllt i ett användarnamn och sparar det
        $loginForm =  $htmlFormView->returnLoginForm($loginStatus,$userLogin[0]);   //här hämtar vi ut inloggningsformuläret, skickar med status + användarnamn

        //HTML grunddelar
        $userName = $loginModel->userModel->returnValidUsername();                  //här hämtar vi ut användarnamnet
        $outputHeader =  $htmlView->returnHead($userName);                          //här hämtas html-"headern" ut, skickar med användarnamnet
        $outputFooter = $htmlView->returnFooter();                                  //här hämtas html-"footern" ut
        $dateString = $dateView->getCorrectDate();                                  //här hämtas ett aktuellt datum ut från Date-vyn

        //visar alla blogposter i HTML
        $blogResult = $blogController->blogModel->returnAllBlogs();                                     //returnerar alla bloggar från databasen
        $HTMLblogs = $htmlBlogView->returnBlogsInHTML($blogResult, $commentController->commentModel);   //alla bloggar i html-format

        //övriga funktioner
        $backbutton = $htmlView->returnBackButton();                                //tillbaka-knappen i html
        $okbutton = $htmlView->returnOKButton();                                    //ok-knappen i html
        $logoutbutton = $htmlView->returnLogoutButton();                            //logga ut-knappen i html
        $addBlogbutton= $htmlView->returnAddBlogButton();                           //lägg till blogpost-knappen i html
        $returnHeadlineLogedIn = $htmlView->returnHeadlineLogedIn();                //överskrift i html när man är inloggad
        $returnHeadlineLogedOut = $htmlView->returnHeadlineLogedOut();              //överskrift i html när man är utloggad
        $userMustBeLogedIn = $htmlView->returnUserMustBeLogedIn();                  //sidan "användaren måste vara inloggad"
        $notYourBlogPost = $htmlBlogView->returnNotYourBlogPost();                  //sidan "inte din blogpost" i html
        $notYourComment = $htmlCommentView->returnNotYourComment();                 //sidan "inte din kommentar" i html
        $adminMenu = $htmlAdminView->returnAdminMenu();                             //själva admin-menyn i html


        //om användaren vill registrerar sig körs följande rader kod
        if ($newUserController->newUserView->wantsToRegisterNewUser()) {
            $newUserMessage = $newUserController->newUserView->returnRegisteredNewUserNameStatusMessage() ;
            $newUserUsername = $newUserController->newUserView->returnRegisteredNewUserName() ;
            $registerForm =  $htmlFormView->returnRegisterForm($newUserMessage, $newUserUsername);
            $registeredNewUserPage = $htmlView->returnSuccessfulNewUserPage() ;

            //om användaren lyckats lägga upp en nya användare annars körs else
            if ($newUserController->newUserModel->hasRegisteredNewUser()) {
                 $output = $outputHeader . $okbutton . $registeredNewUserPage . $outputFooter;
            } else {
                $output = $outputHeader . $backbutton . $registerForm . $outputFooter;
            }
        }

        //här kollas om användaren är inloggad
		else if ($loginModel->m_isUserLogedIn) {

            //användaren vill lägga till ny blogpost
		    if ($blogController->blogView->wantsToAddPost()) {

                //här förbereds att lägga till en blogpost i addBlogPost-funktionen i blogController-classen
                $blogController->addBlogPost();
                $blogInputs = $blogController->blogView->returnNewBlogInput();
                $blogHeader = $blogInputs[0];
                $blogText = $blogInputs[1];
                $blogStatusMessage= $blogController->blogView->returnBlogStatusMessage() ;
                $addNewBlogPostForm = $htmlFormView->returnPostForm($blogStatusMessage, $blogHeader, $blogText);
                $registeredBlogPostPage = $htmlBlogView->returnSuccessfulBlogPostPage($blogHeader, $blogText) ;

                //om användaren har skapat en ny blogpostkörs nedan annars else
                if ($blogController->blogModel->hasRegisteredBlogPost()) {
                    $output = $outputHeader .  $okbutton . $registeredBlogPostPage . $outputFooter;
			    } else {
			            $output = $outputHeader . $backbutton . $addNewBlogPostForm . $outputFooter;
                }

            //om användaren vill editera sin blogpost
            } else if ($blogController->blogView->wantsToEditBlogPost()) {

                //här förbereds editering av bloposten i editBlogPost-funktionen i blogController-classen
                $blogController->editBlogPost();
                $updatedBlogPostId = $blogController->blogView->returnBlogPostId();
                $updatedBlogPostStatusMessage= $blogController->blogView->returnBlogStatusMessage();

                //om användaren har uppdaterat sin blog-post så körs nedanstående annars else
                if ($blogController->blogView->hasUpdatedBlogPostInput()) {
                    $updatedBlogInputs = $blogController->blogView->returnUpdatedBlogInput();
                    $updatedBlogHeader = $updatedBlogInputs[0];
                    $updatedBlogText = $updatedBlogInputs[1];
                    $editPostForm = $htmlFormView->returnEditPostForm($updatedBlogPostId,$updatedBlogPostStatusMessage, $updatedBlogHeader,$updatedBlogText );
                } else {
                    $blogUserWantsToUpdate = $blogController->getBlog($blogController->blogView->returnBlogPostId());
                    $blogHeader = $blogUserWantsToUpdate[1];
                    $blogText = $blogUserWantsToUpdate[2];
                    $editPostForm = $htmlFormView->returnEditPostForm($updatedBlogPostId,$updatedBlogPostStatusMessage, $blogHeader,$blogText);
                }

                //här kollas om det är den inloggade användaren som skapat blog-posten, om inte så får han/hon inte ändra posten
                if ($blogController->checkBlogUser()) {
                    $output = $outputHeader .   $backbutton . $editPostForm . $outputFooter;
                } else {
                     $output = $outputHeader . $backbutton . $notYourBlogPost . $outputFooter;
                }

                //om användaren har lyckats att editera sin blogpost
                if ($blogController->blogModel->hasUpdatedBlogPost()) {
                     $registeredUpdateBlogPostPage = $htmlBlogView->returnSuccessfulUpdateBlogPostPage($updatedBlogHeader, $updatedBlogText);
                     $output = $outputHeader .  $okbutton. $registeredUpdateBlogPostPage . $outputFooter;
                }

            //användaren vill ta bort sin blogpost
            } else if ($blogController->blogView->wantsToRemoveBlogPost()) {

                //här kollas om den inloggade användaren som skapat blogposten eller om användren har admin-behörighet annars else
                if ($blogController->checkBlogUser() || $loginModel->userModel->isUserAdmin()) {
                    $blogController->removeBlogPost($blogController->blogView->returnBlogPostId());
                    $removedPost = $htmlBlogView->returnRemovedBlogPost();
                    $output = $outputHeader .  $okbutton . $removedPost . $outputFooter;
                } else {
                     $output = $outputHeader . $backbutton . $notYourBlogPost . $outputFooter;
                }

            //visa alla kommentarer till en blogpost
            } else if ($commentController->commentView->wantsToShowComments()) {
                $blogId = $commentController->commentView->returnCommentId();
                $blog = $blogController->getBlog($blogId);
                $comments = $commentController->getBlogComments($blogId);
                $blogPostWithComments = $htmlCommentView->returnBlogPostCommentsPage($blog[1], $blog[2], $blog[3],  $blog[4], $comments);
                $output = $outputHeader .  $backbutton . $blogPostWithComments . $outputFooter;

            //användaren vill lägga till kommentar
            } else if ($commentController->commentView->wantsToCommentBlogPost()) {
                $commentController->commentBlogPost();
                $commentStatusMessage= $commentController->commentView->returnCommentStatusMessage();
                $commentText = $commentController->commentView->returnNewCommentInput();
                $commentBlogId = $commentController->commentView->returnCommentId();
                $addCommentForm =  $htmlFormView->returnCommentForm($commentStatusMessage, $commentText, $commentBlogId);
                $registeredCommentPage = $htmlCommentView->returnSuccessfulCommentPage($commentText);

                //om användaren lyckats lägga till en ny kommentar
                if($commentController->commentModel->hasRegisteredComment()) {
                     $output = $outputHeader .  $okbutton. $registeredCommentPage . $outputFooter;

                } else {
                       $output = $outputHeader . $backbutton. $addCommentForm . $outputFooter;
                }

            //om användaren vill editera sin kommentar körs nedanstående else-if
            } else if ($commentController->commentView->wantsToEditComment()) {
                $commentController->editComment();
                $updatedCommentId = $commentController->commentView->returnCommentId();
                $updatedCommentStatusMessage= $commentController->commentView->returnCommentStatusMessage() ;

                if ($commentController->commentView->hasUpdatedCommentInput()) {
                    $updatedCommentText = $commentController->commentView->returnUpdatedCommentInput();
                    $editCommentForm = $htmlFormView->returnEditCommentForm($updatedCommentId, $updatedCommentStatusMessage, $updatedCommentText );
                } else {
                    $commentUserWantsToUpdate = $commentController->getComment($commentController->commentView->returnCommentId());
                    $commentText = $commentUserWantsToUpdate[1];
                    $editCommentForm = $htmlFormView->returnEditCommentForm($updatedCommentId,$updatedCommentStatusMessage, $commentText);
                }

                //här kollas så att det är användaren som skapat kommentaren annars else = får inte editera
                if ($commentController->checkCommentUser()) {
                    $output = $outputHeader .   $backbutton . $editCommentForm . $outputFooter;
                } else {
                     $output = $outputHeader . $backbutton . $notYourComment . $outputFooter;
                }

                //om användaren lyckats editera sin kommentar körs nedan
                if ($commentController->commentModel->hasUpdatedComment()) {
                     $registeredUpdateCommentPage = $htmlCommentView->returnSuccessfulUpdateCommentPage($updatedCommentText);
                     $output = $outputHeader .  $okbutton. $registeredUpdateCommentPage . $outputFooter;
                }

            //om användaren vill ta bort sin kommentar
            } else if ($commentController->commentView->wantsToRemoveComment()) {

                //här kollas om det är den inloggade användaren som vill ta bort kommentaren eller om han/hon är admin, annars else
                if ($commentController->checkCommentUser() || $loginModel->userModel->isUserAdmin()) {
                    $commentController->removeComment($commentController->commentView->returnCommentId());
                    $removedComment = $htmlCommentView->returnRemovedComment();
                    $output = $outputHeader .  $okbutton . $removedComment . $outputFooter;
                } else {
                     $output = $outputHeader . $backbutton . $notYourComment . $outputFooter;
                }

            //detta körs om användaren har loggat in men inte klickat på något                          //förstasidan när man loggat in
            } else {

                //om användaren är admin så körs nedanstående if-sats och admin-funktionerna visas
                if ($loginModel->userModel->isUserAdmin()) {

                    //om admin-användaren har klickat på edit users så kör nedanstående, annars else if
                    if ($adminView->wantsToEditUsers()) {
                        $users = $loginModel->userModel->returnAllUsersInDatabase();
                        $listUsers = $htmlAdminView->returnUserListInHTML($users);
                        $output = $outputHeader .  $backbutton . $listUsers . $outputFooter;
                    } else if ($adminView->wantsToRemoveUser()) {
                        $userId = $adminView->returnUserId();
                        $loginModel->userModel->removeUserFromDatabase($userId);
                        $userRemovedPage = $htmlAdminView->returnRemovedUser();
                        $output = $outputHeader .  $backbutton . $userRemovedPage . $outputFooter;

                    } else if ($adminView->wantsToSetAdmin()) {
                        $userId = $adminView->returnSetAdminUserId();
                        $loginModel->userModel->setAdminUserInDatabase($userId);
                        $setAdminPage = $htmlAdminView->returnAdminUserSet();
                        $output = $outputHeader .  $backbutton . $setAdminPage . $outputFooter;

                    } else {
                        $output = $outputHeader .  $logoutbutton . $addBlogbutton . $dateString . $adminMenu. $returnHeadlineLogedIn .
                        $HTMLblogs. $outputFooter;
                    }

                //annars körs detta om användaren inte är admin = förstasidan när man är inloggad
                } else {
                    $output = $outputHeader .  $logoutbutton . $addBlogbutton . $dateString . $returnHeadlineLogedIn. $HTMLblogs. $outputFooter;
                }
			}

        //och är man inte inloggad så körs nedanstående rader kod beroende på vad användaren klickat på
        } else if ($blogController->blogView->wantsToEditBlogPost()) {
                $output = $outputHeader . $backbutton . $userMustBeLogedIn . $outputFooter;
        } else if ($blogController->blogView->wantsToRemoveBlogPost()) {
                $output = $outputHeader . $backbutton . $userMustBeLogedIn . $outputFooter;
        } else if ($commentController->commentView->wantsToCommentBlogPost()) {
                $output = $outputHeader . $backbutton . $userMustBeLogedIn . $outputFooter;
        } else if ($commentController->commentView->wantsToShowComments()) {
                $output = $outputHeader . $backbutton . $userMustBeLogedIn . $outputFooter;
        } else {
			$output = $outputHeader . $loginForm . $returnHeadlineLogedOut. $HTMLblogs. $outputFooter;
		}

        return $output;         //här returneras outputen till login-kontrollern som sedan skickar den tillbaka till index.php som echo-ar ut den på skärmen
	}


}
